Return to previous page

This file contains statistics and figures from the paper, “Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.

The paper can be found here:

Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution


Single cell transcriptomic profile of the whole vomeronasal organ

What cell types, in what quantities, do we find in the whole VNO?

[1] "There are 34519 cells in the whole VNO dataset."
cell type nCells
V1R_mVSN 13201
V2R_mVSN 4366
SUS 3889
sVSN 2601
V1R_iVSN 1794
V2R_iVSN 1582
Microglia 1366
Immune_Fpr 1222
LP 1072
HBC 912
INP 528
Microglia_rp 455
mOSN 430
T_cells 313
Endothelial 251
OEC 220
GBC 218
MV 99

2D PCA of Clusters

2D PCA of Cell-Types

3D PCA of Clusters

3D PCA of Cell-Types

2D UMAP Clusters

2D UMAP visualization of integrated Cell-Type clusters for whole-VNO single-cell RNA-seq

In two-dimensional UMAP space, 18 cell clusters can be clearly identified.

3D UMAP Clusters

3D UMAP Cell-types

Cell-type marker-gene normalized expression across the cell clusters

These clusters were curated using known cell markers (Fig. 1b).

UMAP of cell-type clusters split by age

UMAP of cell-type clusters split by sex

A representative image of transcript distribution from Molecular Cartography© platform, Resolve Biosciences

Spatial location of individual VNO cells color-coded according to cell type prediction based on the spatial transcriptomic analysis

Location of cell belonging to HBC, GBC, INP, and LP cell types, respectively. Heat indicates confidence of predicted values

LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSAxIgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHN0eWxlLmNzcwotLS0KCioqUmV0dXJuIHRvIHByZXZpb3VzIHBhZ2UqKiAgCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30KCmNhdCgiPGJ1dHRvbiBvbmNsaWNrPSdoaXN0b3J5LmJhY2soKSc+QmFjazwvYnV0dG9uPiIpCgpgYGAKICAKICAKICAKPlRoaXMgZmlsZSBjb250YWlucyBzdGF0aXN0aWNzIGFuZCBmaWd1cmVzIGZyb20gdGhlIHBhcGVyLCAiTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uIiBieSBNYXggSGlsbHMgSnIuLCBMaW1laSBNYSwgQWkgRmFuZywgVGhlbG1hIENoaXJlbWJhLCBTZXRoIE1hbGxveSwgQWxsaXNvbiBTY290dCwgQW5vamEgUGVyZXJhLCBhbmQgQy4gUm9uIFl1LiAgICAKClRoZSBwYXBlciBjYW4gYmUgZm91bmQgaGVyZTogIAoKW01vbGVjdWxhciwgQ2VsbHVsYXIsIGFuZCBEZXZlbG9wbWVudGFsIE9yZ2FuaXphdGlvbiBvZiB0aGUgTW91c2UgVm9tZXJvbmFzYWwgb3JnYW4gYXQgU2luZ2xlIENlbGwgUmVzb2x1dGlvbl0oaHR0cHM6Ly9lbGlmZXNjaWVuY2VzLm9yZy9yZXZpZXdlZC1wcmVwcmludHMvOTczNTYjdGFiLWNvbnRlbnQpCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCiMgUi1NYXJrZG93biBHbG9iYWwgU2V0dGluZ3MgIAoKIyBTZXQtdXAgYSBkZWZhdWx0IGltYWdlIHNpemUgb2YgMTAgWCAxMCBpbmNoZXMuIFN1cHByZXNzIHdhcm5pbmcKIyBhbmQgZXJyb3IgbWVzc2FnZXMuIEhpZGUgY29kZS4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNvbW1lbnQ9IiIsCiAgICAgICAgICAgICAgICAgICAgICBlcnJvcj1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyLCBjYWNoZT1GQUxTRSkKCmBgYAoKYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPUZBTFNFfQoKIyBMaWJyYXJ5IExvYWRpbmcgIAoKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KGtpdCk7IGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShzdHJpbmdyKTsgbGlicmFyeShwbG90M0QpIAogIGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkoZGF0YS50YWJsZSk7IGxpYnJhcnkob3JnLk1tLmVnLmRiKQogIGxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KFNldXJhdCk7IGxpYnJhcnkoREJJKTsgbGlicmFyeShjb3dwbG90KQogIGxpYnJhcnkoTWF0cml4KTsgbGlicmFyeShnbG1HYW1Qb2kpOyBsaWJyYXJ5KGNpcmNsaXplKQogIGxpYnJhcnkodGliYmxlKTsgbGlicmFyeShnZ3B1YnIpOyBsaWJyYXJ5KHN2Z2xpdGUpOyBsaWJyYXJ5KGdnc2lnbmlmKQogIGxpYnJhcnkoc3RhdHMpOyBsaWJyYXJ5KHZlZ2FuKTsgbGlicmFyeShzY2FsZXMpOyBsaWJyYXJ5KGNhcmV0KQogIGxpYnJhcnkocGF0Y2h3b3JrKTsgbGlicmFyeShwbG90bHkpOyBsaWJyYXJ5KGdlb210ZXh0cGF0aCkKICBsaWJyYXJ5KG9wZW54bHN4KTsgbGlicmFyeShncmlkRXh0cmEpOyBsaWJyYXJ5KGdncmVwZWwpCiAgbGlicmFyeShHZW5lT3ZlcmxhcCk7IGxpYnJhcnkoYmlvbWFSdCk7IGxpYnJhcnkoZ2dwb2ludGRlbnNpdHkpCiAgbGlicmFyeShzbGluZ3Nob3QpOyBsaWJyYXJ5KHRyYWRlU2VxKTsgbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKICBsaWJyYXJ5KHZpcmlkaXMpOyBsaWJyYXJ5KFVwU2V0Uik7IGxpYnJhcnkocGhlYXRtYXApOyBsaWJyYXJ5KG1zaWdkYnIpCiAgbGlicmFyeShmZ3NlYSk7IGxpYnJhcnkoZ3JpZCk7IGxpYnJhcnkoSURQbWlzYyk7IGxpYnJhcnkoTUFTUykKICBsaWJyYXJ5KFJtaXNjKTsgbGlicmFyeShnZ3Bsb3RpZnkpOyBsaWJyYXJ5KGdncG1pc2MpOyBsaWJyYXJ5KHNjYWxlcykKICBsaWJyYXJ5KGhlYXRtYXBseSk7IGxpYnJhcnkoZGVuZGV4dGVuZCkKfSkKCmBgYAoKYGBge3J9CgojIEdsb2JhbCBWYXJpYWJsZXMKCiMgVGhlIGhvbWUgZGlyZWN0b3J5CmhvbWVfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvc2NfVk5PLyIKIyBEaXJlY3RvcnkgZm9yIHN0b3JpbmcgZGF0YSBvYmplY3RzIGF0IGNydWNpYWwgc3RhZ2VzCm9iamVjdF9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbC5zZXUub2Jqcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZyb20gdGhlIGZpbmFsIGFuYWx5c2lzCmltYWdlX2RpciA8LSBwYXN0ZTAoaG9tZV9kaXIsImZpbmFsX2ltYWdlcy8iKQphZG9iZV9pbWFnZXMgPC0gcGFzdGUwKGltYWdlX2RpciwgImFkb2JlX2lsbHVzdHJhdG9yX3N2Z19maWxlcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZvciB0aGUgZmluYWwgcGFwZXIKY2x1c3RyZWVfZGlyIDwtIHBhc3RlMChpbWFnZV9kaXIsImNsdXN0cmVlLyIpCiMgQSBkaXJlY3RvcnkgZm9yIFRyYWRlU2VxIGZpdEdBTSBvdXRwdXQKZml0R0FNX2RpciA8LSBwYXN0ZTAob2JqZWN0X2RpciwgImZpdEdBTS8iKQptb2VfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvbW9sbmdfMjQwN18yNDUzL1Jfb2JqLyIKCiMgT1BFTiBgYGB2bm8uc2V1LmludGVncmF0ZWRgYGAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsInZuby5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKI0xvYWQgTmV1cm9uYWwgTGluZWFnZSBTZXVyYXQgT2JqZWN0ICAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIm5ldXJvbi5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKCiMgUmVuYW1lIHVua25vd25fbVZTTiB0byBzVlNOCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUpW2xldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgoKIyBHZXQgY29sb3Igc2NoZW1lIGZvciB0aGUgd2hvbGUgdm5vIGRhdGFzZXQKdm5vLmNlbGxfdHlwZS5jb2xvcnMgPC0gaHVlX3BhbCgpKGxlbmd0aChsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkpKQpuYW1lcyh2bm8uY2VsbF90eXBlLmNvbG9ycykgPC0gbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpCgojIEtlZXAgbmV1cm9uIGRhdGFzZXQgY29sb3Igc2NoZW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2hvbGUgdm5vIGNvbG9yIHNjaGVtZSwgd2hlcmUgcG9zc2libGUgIApuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSB2bm8uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iLCJWMVJfaVZTTiIsIlYyUl9pVlNOIiwiR0JDIildCm5ldXJvbi5jZWxsX3R5cGUuY29sb3JzIDwtIHNldE5hbWVzKGMobmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMsIiMwMEIwRjYiLCIjOTU5MEZGIiwiI0U3NkJGMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKG5hbWVzKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzKSwiaU9TTiIsImxhdGVfSU5QIiwiZWFybHlfSU5QIikpCgptYXR1cmUubmV1cm9ucyA8LSBzdWJzZXQobmV1cm9uLmludGVncmF0ZWQsaWRlbnRzPWMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpKQptYXR1cmUuY2VsbF90eXBlLmNvbG9ycyA8LSBuZXVyb24uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKV0KCmdsb2JhbC52YXJzIDwtIGMobHMoKSwiZ2xvYmFsLnZhcnMiKQoKYGBgCgoqKiogIAoKIyBTaW5nbGUgY2VsbCB0cmFuc2NyaXB0b21pYyBwcm9maWxlIG9mIHRoZSB3aG9sZSB2b21lcm9uYXNhbCBvcmdhbiB7LnRhYnNldCAudGFic2V0LXBpbGxzfSAgCgojIyBXaGF0IGNlbGwgdHlwZXMsIGluIHdoYXQgcXVhbnRpdGllcywgZG8gd2UgZmluZCBpbiB0aGUgd2hvbGUgVk5PPyAgCgpgYGB7cn0KCnByaW50KHBhc3RlKCJUaGVyZSBhcmUiLGRpbSh2bm8uc2V1LmludGVncmF0ZWQpWzJdLCJjZWxscyBpbiB0aGUgd2hvbGUgVk5PIGRhdGFzZXQuIikpCmtuaXRyOjprYWJsZShzb3J0KHRhYmxlKHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUpLCBkZWNyZWFzaW5nID0gVFJVRSksY29sLm5hbWVzPWMoImNlbGwgdHlwZSIsIm5DZWxscyIpKQoKYGBgCgojIyAyRCBQQ0Egb2YgQ2x1c3RlcnMgIAoKYGBge3J9Cgp2bm8uc2V1LmludGVncmF0ZWQkc2V1cmF0X2NsdXN0ZXJzIDwtIGZhY3Rvcih2bm8uc2V1LmludGVncmF0ZWQkc2V1cmF0X2NsdXN0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YXMuY2hhcmFjdGVyKDA6MzApKQoKYGBgCgoKYGBge3J9CgpJZGVudHModm5vLnNldS5pbnRlZ3JhdGVkKSA8LSB2bm8uc2V1LmludGVncmF0ZWQkc2V1cmF0X2NsdXN0ZXJzCnZuby4yZC5jbHVzdGVyLnBjYSA8LSBEaW1QbG90KHZuby5zZXUuaW50ZWdyYXRlZCwgcmVkdWN0aW9uPSJwY2EiLCBsYWJlbD1UUlVFLCBzaHVmZmxlPVRSVUUsIHJlcGVsPVRSVUUsIHB0LnNpemU9MS4yNSkgKwogIGdndGl0bGUoIlZOTyBQQ0EgQ2x1c3RlcnMiKQoKdm5vLjJkLmNsdXN0ZXIucGNhCgpgYGAKCiMjIDJEIFBDQSBvZiBDZWxsLVR5cGVzICAKCmBgYHtyfQoKSWRlbnRzKHZuby5zZXUuaW50ZWdyYXRlZCkgPC0gdm5vLnNldS5pbnRlZ3JhdGVkJGNlbGxfdHlwZQp2bm8uMmQuY2x1c3Rlci5wY2EgPC0gRGltUGxvdCh2bm8uc2V1LmludGVncmF0ZWQsIHJlZHVjdGlvbj0icGNhIiwgbGFiZWw9VFJVRSwgc2h1ZmZsZT1UUlVFLCByZXBlbD1UUlVFLCBwdC5zaXplPTEuMjUpICsKICBnZ3RpdGxlKCJWTk8gUENBIENlbGwtVHlwZXMiKQoKdm5vLjJkLmNsdXN0ZXIucGNhCgpgYGAKCiMjIDNEIFBDQSBvZiBDbHVzdGVycyAgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKIyBQcmVwYXJlIGEgZGF0YWZyYW1lIGZvciBjZWxsIHBsb3R0aW5nLiBUaGUgbGFzdCBjb2x1bW4gd2lsbCBkZXRlcm1pbmUgdGhlIGNvbG9yIG9mIHRoZSBkYXRhcG9pbnRzLgp2bm8uM2QucGNhLmRmIDwtIEZldGNoRGF0YShvYmplY3QgPSB2bm8uc2V1LmludGVncmF0ZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzID0gYygiUENfMSIsICJQQ18yIiwgIlBDXzMiLCAic2V1cmF0X2NsdXN0ZXJzIikpCgpgYGAKCmBgYHtyfQoKIyBTb3J0IHRoZSBjbHVzdGVyIGxldmVscyBudW1lcmljYWxseQpzb3J0ZWRfbGV2ZWxzIDwtIHNvcnQoYXMubnVtZXJpYyhsZXZlbHModm5vLjNkLnBjYS5kZiRzZXVyYXRfY2x1c3RlcnMpKSkKCiMgU2V0IHRoZSBzZXVyYXRfY2x1c3RlcnMgdG8gYmUgYSBmYWN0b3Igd2l0aCBzb3J0ZWQgbGV2ZWxzCnZuby4zZC5wY2EuZGYkc2V1cmF0X2NsdXN0ZXJzIDwtIGZhY3Rvcih2bm8uM2QucGNhLmRmJHNldXJhdF9jbHVzdGVycywgbGV2ZWxzID0gc29ydGVkX2xldmVscykKCmBgYAoKYGBge3J9CgpuQ29sb3JzLmNsdXN0ZXJzIDwtIGxlbmd0aChzb3J0ZWRfbGV2ZWxzKQp2bm8uY2x1c3Rlci5jb2xvcnMgPC0gaHVlX3BhbCgpKG5Db2xvcnMuY2x1c3RlcnMpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgojIFBsb3Qgd2l0aCBzbWFsbGVyIG1hcmtlciBzaXplCnAgPC0gcGxvdF9seShkYXRhID0gdm5vLjNkLnBjYS5kZiwKICAgICAgICAgICAgIHggPSB+UENfMSwgeSA9IH5QQ18yLCB6ID0gflBDXzMsCiAgICAgICAgICAgICBjb2xvciA9IH5zZXVyYXRfY2x1c3RlcnMsCiAgICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgICAgICAgY29sb3JzID0gdm5vLmNsdXN0ZXIuY29sb3JzLAogICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMiksCiAgICAgICAgICAgICB0ZXh0ID0gfnNldXJhdF9jbHVzdGVycywKICAgICAgICAgICAgIGhvdmVyaW5mbz0idGV4dCIpICU+JQogIAogICMgTGF5b3V0CiAgbGF5b3V0KAogICAgdGl0bGUgPSAiVk5PIFBDQSBDbHVzdGVycyIsCiAgICBsZWdlbmQgPSBsaXN0KAogICAgICB0aXRsZSA9IGxpc3QodGV4dD0nPGI+IENsdXN0ZXJzIDwvYj4nKSwKICAgICAgaXRlbXNpemluZyA9ICdjb25zdGFudCcKICAgICkKICApCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTV9CgpwCgpgYGAKCiMjIDNEIFBDQSBvZiBDZWxsLVR5cGVzICAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgojIFByZXBhcmUgYSBkYXRhZnJhbWUgZm9yIGNlbGwgcGxvdHRpbmcuIFRoZSBsYXN0IGNvbHVtbiB3aWxsIGRldGVybWluZSB0aGUgY29sb3Igb2YgdGhlIGRhdGFwb2ludHMuCnZuby4zZC5wY2EuZGYgPC0gRmV0Y2hEYXRhKG9iamVjdCA9IHZuby5zZXUuaW50ZWdyYXRlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMgPSBjKCJQQ18xIiwgIlBDXzIiLCAiUENfMyIsICJjZWxsX3R5cGUiKSkKCmBgYAoKYGBge3J9CgojIFNvcnQgdGhlIGNsdXN0ZXIgbGV2ZWxzIG51bWVyaWNhbGx5CnNvcnRlZF9sZXZlbHMgPC0gbGV2ZWxzKHZuby4zZC5wY2EuZGYkY2VsbF90eXBlKQojIFNldCB0aGUgc2V1cmF0X2NsdXN0ZXJzIHRvIGJlIGEgZmFjdG9yIHdpdGggc29ydGVkIGxldmVscwp2bm8uM2QucGNhLmRmJGNlbGxfdHlwZSA8LSBmYWN0b3Iodm5vLjNkLnBjYS5kZiRjZWxsX3R5cGUsIGxldmVscyA9IHNvcnRlZF9sZXZlbHMpCgpgYGAKCmBgYHtyfQoKbkNvbG9ycy5jbHVzdGVycyA8LSBsZW5ndGgoc29ydGVkX2xldmVscykKdm5vLmNsdXN0ZXIuY29sb3JzIDwtIGh1ZV9wYWwoKShuQ29sb3JzLmNsdXN0ZXJzKQoKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKIyBQbG90IHdpdGggc21hbGxlciBtYXJrZXIgc2l6ZQpwIDwtIHBsb3RfbHkoZGF0YSA9IHZuby4zZC5wY2EuZGYsCiAgICAgICAgICAgICB4ID0gflBDXzEsIHkgPSB+UENfMiwgeiA9IH5QQ18zLAogICAgICAgICAgICAgY29sb3IgPSB+Y2VsbF90eXBlLAogICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICAgICAgIGNvbG9ycyA9IHZuby5jbHVzdGVyLmNvbG9ycywKICAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDIpLAogICAgICAgICAgICAgdGV4dCA9IH5jZWxsX3R5cGUsCiAgICAgICAgICAgICBob3ZlcmluZm89InRleHQiKSAlPiUKICAKICAjIExheW91dAogIGxheW91dCgKICAgIHRpdGxlID0gIlZOTyBQQ0EgQ2VsbC1UeXBlcyIsCiAgICBsZWdlbmQgPSBsaXN0KAogICAgICB0aXRsZSA9IGxpc3QodGV4dD0nPGI+IENlbGwtVHlwZSA8L2I+JyksCiAgICAgIGl0ZW1zaXppbmcgPSAnY29uc3RhbnQnCiAgICApCiAgKQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTE1fQoKIyBQbG90IHRoZSBvdXRwdXQKcAoKYGBgCgojIyAyRCBVTUFQIENsdXN0ZXJzICAKCmBgYHtyfQoKSWRlbnRzKHZuby5zZXUuaW50ZWdyYXRlZCkgPC0gdm5vLnNldS5pbnRlZ3JhdGVkJHNldXJhdF9jbHVzdGVycwoKZmlnXzFBIDwtIERpbVBsb3Qodm5vLnNldS5pbnRlZ3JhdGVkLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsID0gVFJVRSwgc2h1ZmZsZSA9IFRSVUUpICsKICBnZ3RpdGxlKCJWTk8gQ2x1c3RlcnMiKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKZmlnXzFBCgpgYGAKCiMjIDJEIFVNQVAgdmlzdWFsaXphdGlvbiBvZiBpbnRlZ3JhdGVkICoqQ2VsbC1UeXBlKiogY2x1c3RlcnMgZm9yIHdob2xlLVZOTyBzaW5nbGUtY2VsbCBSTkEtc2VxICAKCj5JbiB0d28tZGltZW5zaW9uYWwgVU1BUCBzcGFjZSwgMTggY2VsbCBjbHVzdGVycyBjYW4gYmUgY2xlYXJseSBpZGVudGlmaWVkLgoKYGBge3J9CgpJZGVudHModm5vLnNldS5pbnRlZ3JhdGVkKSA8LSB2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlCgpmaWcxX2EgPC0gRGltUGxvdCh2bm8uc2V1LmludGVncmF0ZWQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFLCBzaHVmZmxlID0gVFJVRSkgKwogIGdndGl0bGUoIlZvbWVyb25hc2FsIE9yZ2FuIENlbGwgQ2x1c3RlcnMiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMV9hLnN2ZyIpLCB3aWR0aD0xMCwgaGVpZ2h0PTgpCmZpZzFfYQppbnZpc2libGUoZGV2Lm9mZigpKQpmaWcxX2EKCmBgYAoKIyMgM0QgVU1BUCBDbHVzdGVycyAgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKRGVmYXVsdEFzc2F5KHZuby5zZXUuaW50ZWdyYXRlZCkgPC0gImludGVncmF0ZWQiCiMgUmUtcnVuIFVNQVAgaW4gNTAgZGltZW5zaW9ucyBhbmQgcmV0YWluIGNhbGN1bGF0aW9ucyBmb3IgdGhlIGZpcnN0IDMgZGltZW5zaW9ucwp2bm8uM2QudW1hcC5zZXUgPC0gUnVuVU1BUCh2bm8uc2V1LmludGVncmF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zID0gMToyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uY29tcG9uZW50cyA9IDNMKQoKIyBQcmVwYXJlIGEgZGF0YWZyYW1lIGZvciBjZWxsIHBsb3R0aW5nLiBUaGUgbGFzdCBjb2x1bW4gd2lsbCBkZXRlcm1pbmUgdGhlIGNvbG9yIG9mIHRoZSBkYXRhcG9pbnRzLgp2bm8uM2QudW1hcC5kZiA8LSBGZXRjaERhdGEob2JqZWN0PXZuby4zZC51bWFwLnNldSx2YXJzPWMoIlVNQVBfMSIsIlVNQVBfMiIsIlVNQVBfMyIsInNldXJhdF9jbHVzdGVycyIpKQoKcm0odm5vLjNkLnVtYXAuc2V1KTsgaW52aXNpYmxlKGdjKCkpCgpgYGAKCmBgYHtyfQoKIyBTb3J0IHRoZSBjbHVzdGVyIGxldmVscyBudW1lcmljYWxseQpzb3J0ZWRfbGV2ZWxzIDwtIHNvcnQoYXMubnVtZXJpYyhsZXZlbHModm5vLjNkLnVtYXAuZGYkc2V1cmF0X2NsdXN0ZXJzKSkpCgojIFNldCB0aGUgc2V1cmF0X2NsdXN0ZXJzIHRvIGJlIGEgZmFjdG9yIHdpdGggc29ydGVkIGxldmVscwp2bm8uM2QudW1hcC5kZiRzZXVyYXRfY2x1c3RlcnMgPC0gZmFjdG9yKHZuby4zZC51bWFwLmRmJHNldXJhdF9jbHVzdGVycywgbGV2ZWxzID0gc29ydGVkX2xldmVscykKCmBgYAoKYGBge3J9CgpuQ29sb3JzLmNsdXN0ZXJzIDwtIGxlbmd0aChsZXZlbHModm5vLjNkLnVtYXAuZGYkc2V1cmF0X2NsdXN0ZXJzKSkKdm5vLmNsdXN0ZXIuY29sb3JzIDwtIGh1ZV9wYWwoKShuQ29sb3JzLmNsdXN0ZXJzKQoKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKIyBQbG90IHdpdGggc21hbGxlciBtYXJrZXIgc2l6ZQp2bm8uM2QudW1hcC5jbHVzdGVyIDwtIHBsb3RfbHkoZGF0YSA9IHZuby4zZC51bWFwLmRmLAogICAgICAgICAgICAgICB4ID0gflVNQVBfMSwgeSA9IH5VTUFQXzIsIHogPSB+VU1BUF8zLAogICAgICAgICAgICAgICBjb2xvciA9IH5zZXVyYXRfY2x1c3RlcnMsCiAgICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICAgICAgICAgY29sb3JzID0gdm5vLmNsdXN0ZXIuY29sb3JzLAogICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAyKSwKICAgICAgICAgICAgICAgdGV4dCA9IH5zZXVyYXRfY2x1c3RlcnMsCiAgICAgICAgICAgICAgIGhvdmVyaW5mbz0idGV4dCIsCiAgICAgICAgICAgICAgIHNob3dsZWdlbmQgPSBUUlVFKSAlPiUgICMgSGlkZSBsZWdlbmQgZm9yIG9yaWdpbmFsIHRyYWNlCiAgCiAgIyBMYXlvdXQKICBsYXlvdXQoCiAgICB0aXRsZSA9ICJWTk8gVU1BUCBDbHVzdGVycyIsCiAgICBsZWdlbmQgPSBsaXN0KAogICAgICB0aXRsZSA9IGxpc3QodGV4dD0nPGI+IENsdXN0ZXJzIDwvYj4nKSwKICAgICAgaXRlbXNpemluZyA9ICdjb25zdGFudCcKICAgICkKICApCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTV9Cgp2bm8uM2QudW1hcC5jbHVzdGVyCgpgYGAKCiMjIDNEIFVNQVAgQ2VsbC10eXBlcyAgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKRGVmYXVsdEFzc2F5KHZuby5zZXUuaW50ZWdyYXRlZCkgPC0gImludGVncmF0ZWQiCiMgUmUtcnVuIFVNQVAgaW4gNTAgZGltZW5zaW9ucyBhbmQgcmV0YWluIGNhbGN1bGF0aW9ucyBmb3IgdGhlIGZpcnN0IDMgZGltZW5zaW9ucwp2bm8uM2QudW1hcC5zZXUgPC0gUnVuVU1BUCh2bm8uc2V1LmludGVncmF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOjI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBuLmNvbXBvbmVudHMgPSAzTCkKCiMgUHJlcGFyZSBhIGRhdGFmcmFtZSBmb3IgY2VsbCBwbG90dGluZy4gVGhlIGxhc3QgY29sdW1uIHdpbGwgZGV0ZXJtaW5lIHRoZSBjb2xvciBvZiB0aGUgZGF0YXBvaW50cy4Kdm5vLjNkLnVtYXAuZGYgPC0gRmV0Y2hEYXRhKG9iamVjdD12bm8uM2QudW1hcC5zZXUsdmFycz1jKCJVTUFQXzEiLCJVTUFQXzIiLCJVTUFQXzMiLCJjZWxsX3R5cGUiKSkKCnJtKHZuby4zZC51bWFwLnNldSk7IGludmlzaWJsZShnYygpKQoKYGBgCgpgYGB7cn0KCiMgU29ydCB0aGUgY2x1c3RlciBsZXZlbHMgbnVtZXJpY2FsbHkKc29ydGVkX2xldmVscyA8LSBsZXZlbHModm5vLjNkLnVtYXAuZGYkY2VsbF90eXBlKQojIFNldCB0aGUgc2V1cmF0X2NsdXN0ZXJzIHRvIGJlIGEgZmFjdG9yIHdpdGggc29ydGVkIGxldmVscwp2bm8uM2QudW1hcC5kZiRjZWxsX3R5cGUgPC0gZmFjdG9yKHZuby4zZC51bWFwLmRmJGNlbGxfdHlwZSwgbGV2ZWxzID0gc29ydGVkX2xldmVscykKCmBgYAoKYGBge3J9CgpuQ29sb3JzLmNsdXN0ZXJzIDwtIGxlbmd0aChsZXZlbHModm5vLjNkLnVtYXAuZGYkY2VsbF90eXBlKSkKdm5vLmNsdXN0ZXIuY29sb3JzIDwtIGh1ZV9wYWwoKShuQ29sb3JzLmNsdXN0ZXJzKQoKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKIyBQbG90IHdpdGggc21hbGxlciBtYXJrZXIgc2l6ZQp2bm8uM2QudW1hcC5jbHVzdGVyIDwtIHBsb3RfbHkoZGF0YSA9IHZuby4zZC51bWFwLmRmLAogICAgICAgICAgICAgICB4ID0gflVNQVBfMSwgeSA9IH5VTUFQXzIsIHogPSB+VU1BUF8zLAogICAgICAgICAgICAgICBjb2xvciA9IH5jZWxsX3R5cGUsCiAgICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICAgICAgICAgY29sb3JzID0gdm5vLmNsdXN0ZXIuY29sb3JzLAogICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAyKSwKICAgICAgICAgICAgICAgdGV4dCA9IH5jZWxsX3R5cGUsCiAgICAgICAgICAgICAgIGhvdmVyaW5mbz0idGV4dCIsCiAgICAgICAgICAgICAgIHNob3dsZWdlbmQgPSBUUlVFKSAlPiUKICAjIExheW91dAogIGxheW91dCgKICAgIHRpdGxlID0gIlZOTyBVTUFQIENlbGwtVHlwZXMiLAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgdGl0bGUgPSBsaXN0KHRleHQ9JzxiPiBDZWxsLVR5cGUgPC9iPicpLAogICAgICBpdGVtc2l6aW5nID0gJ2NvbnN0YW50JwogICAgKQogICkKCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xNX0KCnZuby4zZC51bWFwLmNsdXN0ZXIKCmBgYAoKIyMgQ2VsbC10eXBlIG1hcmtlci1nZW5lIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBhY3Jvc3MgdGhlIGNlbGwgY2x1c3RlcnMgIAoKPlRoZXNlIGNsdXN0ZXJzIHdlcmUgY3VyYXRlZCB1c2luZyBrbm93biBjZWxsIG1hcmtlcnMgKEZpZy4gMWIpLgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgojIE91ciBtYXJrZXIgZ2VuZXMgdG8gcGxvdCAgCnBsb3QuZ2VuZXMgPC0gYygiT21wIiwiR25haTIiLCJHbmcxMyIsIk1laXMyIiwiR25hbzEiLCJSb2JvMiIsIlRmYXAyZSIsIkduYWwiLCJDbmdhMiIsIlAycnkxNCIsIlhpc3QiLAogICAgICAgICAgICAgICAgIkdhcDQzIiwiU3RtbjIiLCJOZXVyb2cxIiwiTmV1cm9kMSIsIkNjbmQxIiwiQXNjbDEiLCJLcnQ1IiwiS3J0MTUiLCJTb3g5IiwiSGVwYWNhbTIiLAogICAgICAgICAgICAgICAgIkZlemYyIiwiU294MiIsIlBscDEiLCJTMTAwYiIsIkNkaDUiLCJDZDM0IiwiQWN0YTIiLCJDb2wxYTIiLCJDdHNzIiwiRG9jazIiLCJDZDIwOWEiLAogICAgICAgICAgICAgICAgIlMxMDBhOSIsIlRyYmMyIikKCmBgYAoKCmBgYHtyLCBpbmN1ZGU9RkFMU0V9Cgp2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmFzc2F5IDwtICJSTkEiCiMgR2V0IGNlbGwgZXhwcmVzc2lvbiBkYXRhIGZvciB0aGUgZ29pLCB0aGUgY2x1c3RlciwgYW5kIHRoZSBjZWxsLXR5cGUKdm5vLm1hcmtlcl9nZW5lcy5kZiA8LSBGZXRjaERhdGEob2JqZWN0ID0gdm5vLnNldS5pbnRlZ3JhdGVkLCBzbG90PSdkYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycyA9IGMocGxvdC5nZW5lcywgInNldXJhdF9jbHVzdGVycyIsICJjZWxsX3R5cGUiKSkKdm5vLm1hcmtlcl9nZW5lcy5kZiRDZWxsIDwtIHJvd25hbWVzKHZuby5tYXJrZXJfZ2VuZXMuZGYpCgpwbG90LmdlbmVzIDwtIHBsb3QuZ2VuZXNbcGxvdC5nZW5lcyAlaW4lIGNvbG5hbWVzKHZuby5tYXJrZXJfZ2VuZXMuZGYpXQoKIyBSZXNoYXBlIHRoZSBkYXRhIGZvciBwbG90dGluZwp2bm8ubWFya2VyX2dlbmVzLmRmIDwtIHJlc2hhcGUyOjptZWx0KHZuby5tYXJrZXJfZ2VuZXMuZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLnZhcnMgPSBjKCJDZWxsIiwic2V1cmF0X2NsdXN0ZXJzIiwiY2VsbF90eXBlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUudmFycyA9IHBsb3QuZ2VuZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJHZW5lIiwgdmFsdWUubmFtZSA9ICJFeHByIikKCmBgYAoKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKIyBPcmRlciB0aGUgZ2VuZSBmYWN0b3IgbGV2ZWxzCnZuby5tYXJrZXJfZ2VuZXMuZGYkR2VuZSA8LQogIGZhY3Rvcih2bm8ubWFya2VyX2dlbmVzLmRmJEdlbmUsCiAgICAgICAgIGxldmVscz1jKCJPbXAiLCJHbmFpMiIsIkduZzEzIiwiTWVpczIiLCJHbmFvMSIsIlJvYm8yIiwiVGZhcDJlIiwiR25hbCIsIkNuZ2EyIiwiUDJyeTE0IiwiWGlzdCIsCiAgICAgICAgICAgICAgICAiR2FwNDMiLCJTdG1uMiIsIk5ldXJvZzEiLCJOZXVyb2QxIiwiQ2NuZDEiLCJBc2NsMSIsIktydDUiLCJLcnQxNSIsIlNveDkiLCJIZXBhY2FtMiIsCiAgICAgICAgICAgICAgICAiRmV6ZjIiLCJTb3gyIiwiUGxwMSIsIlMxMDBiIiwiQ2RoNSIsIkNkMzQiLCJBY3RhMiIsIkNvbDFhMiIsIkN0c3MiLCJEb2NrMiIsIkNkMjA5YSIsCiAgICAgICAgICAgICAgICAiUzEwMGE5IiwiVHJiYzIiKSkKCiMgT3JkZXIgdGhlIHNldXJhdF9jbHVzdGVycyBmYWN0b3IgbGV2ZWxzCnZuby5tYXJrZXJfZ2VuZXMuZGYkc2V1cmF0X2NsdXN0ZXJzIDwtIGZhY3Rvcih2bm8ubWFya2VyX2dlbmVzLmRmJHNldXJhdF9jbHVzdGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCIwIiwiMSIsIjIiLCIzIiwiMTMiLCIyMyIsIjUiLCIxMCIsIjE1IiwiMjEiLCIyOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI5IiwiMTIiLCI2IiwiNyIsIjE5IiwiMjYiLCIxNyIsIjI4IiwiMjciLCI0IiwiMTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTgiLCIzMCIsIjI1IiwiMjQiLCIxNiIsIjgiLCIyMCIsIjE0IiwiMjIiKSkKCmBgYAoKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKIyBHZXQgb3JkZXJlZCBsZWdlbmQgZGF0YQpsZWdlbmQuZGYgPC0gZGF0YS5mcmFtZShjbHVzdGVyPWxldmVscyh2bm8ubWFya2VyX2dlbmVzLmRmJHNldXJhdF9jbHVzdGVycyksCiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxfdHlwZT1jKHJlcCgiVjFSX21WU04iLDYpLHJlcCgiVjJSX21WU04iLDMpLHJlcCgibU9TTiIsMikscmVwKCJzVlNOIiwyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJWMVJfaVZTTiIsMSksIlYyUl9pVlNOIiwiSU5QIiwiR0JDIixyZXAoIkhCQyIsMiksIk1WIixyZXAoIlNVUyIsNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPRUMiLCJFbmRvdGhlbGlhbCIscmVwKCJMUCIsMSkscmVwKCJNaWNyb2dsaWEiLDEpLCJNaWNyb2dsaWFfcnAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1tdW5lX0ZwciIsIlRfY2VsbHMiKSkKCmxlZ2VuZC5kZiRjbHVzdGVyIDwtIGZhY3RvcihsZWdlbmQuZGYkY2x1c3RlciwgbGV2ZWxzPWxldmVscyh2bm8ubWFya2VyX2dlbmVzLmRmJHNldXJhdF9jbHVzdGVycykpCmxlZ2VuZC5kZiRjZWxsX3R5cGUgPC0gZmFjdG9yKGxlZ2VuZC5kZiRjZWxsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iLCJWMVJfaVZTTiIsIlYyUl9pVlNOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOUCIsIkdCQyIsIkhCQyIsIk1WIiwiU1VTIiwiT0VDIiwiRW5kb3RoZWxpYWwiLCJMUCIsIk1pY3JvZ2xpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWNyb2dsaWFfcnAiLCJJbW11bmVfRnByIiwiVF9jZWxscyIpKQoKYGBgCgoKYGBge3IgZmlnLndpZHRoPTI1LCBmaWcuaGVpZ2h0PTIwfQoKZmlnMV9iLnBhcnQxIDwtIGdncGxvdCh2bm8ubWFya2VyX2dlbmVzLmRmLCBhZXMoeD1zZXVyYXRfY2x1c3RlcnMsIEV4cHIsIGZpbGw9Y2VsbF90eXBlKSkgKwogIGdlb21fdmlvbGluKHNjYWxlID0gIndpZHRoIiwgYWRqdXN0ID0gMSwgdHJpbSA9IFRSVUUpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgcG9zaXRpb249InJpZ2h0IiwgbGFiZWxzID0gZnVuY3Rpb24oeCkKICAgICAgICAgICAgICAgICAgICAgYyhyZXAoeCA9ICIiLCB0aW1lcyA9IGxlbmd0aCh4KS0yKSwgeFtsZW5ndGgoeCkgLSAxXSwgIiIpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhHZW5lKSwgc2NhbGVzID0gImZyZWUiLCBzd2l0Y2ggPSAieSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAsICJsaW5lcyIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT01NiwgZmFjZT0iYm9sZCIsIGhqdXN0PTAuNyksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0LnkubGVmdCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHNpemU9NDApLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT00MCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9NTAsIHZqdXN0PTAuNSkpICsKICBnZ3RpdGxlKCJWTk8gQ2VsbC1UeXBlIE1hcmtlci1HZW5lIE5vcm1hbGl6ZWQgRXhwcmVzc2lvbiBieSBDbHVzdGVyIikgKyB5bGFiKCJOb3JtYWxpemVkIEdlbmUgRXhwcmVzc2lvbiIpCgpmaWcxX2IucGFydDIgPC0gZ2dwbG90KGxlZ2VuZC5kZiwgYWVzKHggPSBjbHVzdGVyLCB5ID0gMSwgZmlsbCA9IGNlbGxfdHlwZSkpICsgCiAgZ2VvbV90aWxlKHdpZHRoPTAuOTcpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gdm5vLmNlbGxfdHlwZS5jb2xvcnMpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChkaXJlY3Rpb24gPSAidmVydGljYWwiLCBsYWJlbC5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUudGhlbWUgPSBlbGVtZW50X2JsYW5rKCksIGtleWhlaWdodCA9IDAuNSwgbnJvdyA9IDMsIGJ5cm93ID0gVFJVRSkpICsKICB0aGVtZShsZWdlbmQua2V5LnNpemUgPSB1bml0KDIsICdsaW5lcycpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyPTIsIHVuaXQ9J3B0JyksIHNpemU9MzApLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gImNlbnRlciIsCiAgICAgICAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbigwLDAsMCwwKSwKICAgICAgICBsZWdlbmQuYm94Lm1hcmdpbiA9IG1hcmdpbigtMTAsNSwwLDApLAogICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDMsICJsaW5lcyIpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCA3LCA3LCA3LCAicHQiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT02MCwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMC41LCBjb2xvciA9ICJibGFjayIsIHNpemU9NDApLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplPTUwLCB2anVzdD0wLjUpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpICsgeGxhYigiQ2x1c3RlciIpCgpmaWcxX2IgPC0gcGxvdF9ncmlkKGZpZzFfYi5wYXJ0MSwgZmlnMV9iLnBhcnQyLCBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuODMsIDAuMTcpLCAKICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICJodiIsIGF4aXMgPSAibHIiKQpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMV9iLnN2ZyIpLHdpZHRoPTI1LCBoZWlnaHQ9MjApCmZpZzFfYgppbnZpc2libGUoZGV2Lm9mZigpKQoKZmlnMV9iCgpgYGAKCiMjIFVNQVAgb2YgY2VsbC10eXBlIGNsdXN0ZXJzIHNwbGl0IGJ5IGFnZSAgCgpgYGB7ciwgZmlnLndpZHRoPTE2LGZpZy5oZWlnaHQ9OH0KCmZpZzFfYyA8LSBEaW1QbG90KHZuby5zZXUuaW50ZWdyYXRlZCwgcmVkdWN0aW9uID0gInVtYXAiLCBzaHVmZmxlID0gVFJVRSwgc3BsaXQuYnkgPSAiYWdlIiwgbmNvbCA9IDIpICYKICB0aGVtZV92b2lkKCkgJiB0aGVtZShhc3BlY3QucmF0aW89MSwgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2LCBmYWNlPSJib2xkIikpICYgTm9MZWdlbmQoKQoKc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChhZG9iZV9pbWFnZXMsImZpZzFfYy5zdmciKSwgd2lkdGg9MTAsIGhlaWdodD01KQpmaWcxX2MKaW52aXNpYmxlKGRldi5vZmYoKSkKZmlnMV9jCgpgYGAKCiMjIFVNQVAgb2YgY2VsbC10eXBlIGNsdXN0ZXJzIHNwbGl0IGJ5IHNleCAgCgpgYGB7ciwgZmlnLndpZHRoPTE2LGZpZy5oZWlnaHQ9OH0KCmZpZzFfZCA8LSBEaW1QbG90KHZuby5zZXUuaW50ZWdyYXRlZCwgcmVkdWN0aW9uID0gInVtYXAiLCBzaHVmZmxlID0gVFJVRSwgc3BsaXQuYnkgPSAic2V4IiwgbmNvbCA9IDIpICsKICB0aGVtZV92b2lkKCkgKyB0aGVtZShhc3BlY3QucmF0aW89MSwgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2LCBmYWNlPSJib2xkIikpICsgTm9MZWdlbmQoKQoKc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChhZG9iZV9pbWFnZXMsImZpZzFfZC5zdmciKSwgd2lkdGg9MTAsIGhlaWdodD01KQpmaWcxX2QKaW52aXNpYmxlKGRldi5vZmYoKSkKZmlnMV9kCgpgYGAKCiMjIEEgcmVwcmVzZW50YXRpdmUgaW1hZ2Ugb2YgdHJhbnNjcmlwdCBkaXN0cmlidXRpb24gZnJvbSBNb2xlY3VsYXIgQ2FydG9ncmFwaHnCqSBwbGF0Zm9ybSwgUmVzb2x2ZSBCaW9zY2llbmNlcwoKIVtdKC9sL1l1L1l1TGFiL0xhYiBQYXBlci9JblByZXAvVk5PX2F0bGFzL0ZpbmFsIFZlcnNpb25zL2ZpZ3VyZV9wYW5lbHMvRmlndXJlMV9FLnBuZykKCiMjIFNwYXRpYWwgbG9jYXRpb24gb2YgaW5kaXZpZHVhbCBWTk8gY2VsbHMgY29sb3ItY29kZWQgYWNjb3JkaW5nIHRvIGNlbGwgdHlwZSBwcmVkaWN0aW9uIGJhc2VkIG9uIHRoZSBzcGF0aWFsIHRyYW5zY3JpcHRvbWljIGFuYWx5c2lzICAKCmBgYHtyLCBldmFsPUZBTFNFfQoKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCJyZXNvbHZlLnNldS5QT1NUcHJlZGljdCIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInJlc29sdmUuZGF0YXNldHMuUE9TVHByZWRpY3QiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCJyZXNvbHZlLnByZWRpY3Rpb25zLmFzc2F5IikpCgpgYGAKCmBgYHtyfQoKcmVzb2x2ZS5jZWxsLnR5cGVzIDwtIAogIGFzLmZhY3Rvcih1bmxpc3QobGFwcGx5KGNvbG5hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpLCBmdW5jdGlvbihjZWxsKXsKICByb3duYW1lcyhyZXNvbHZlLnByZWRpY3Rpb25zLmFzc2F5KVt3aGljaC5tYXgoeD1yZXNvbHZlLnByZWRpY3Rpb25zLmFzc2F5WyAsY2VsbF0pXQp9KSkpCgpgYGAKCmBgYHtyfQoKSWRlbnRzKHJlc29sdmUuc2V1LmludGVncmF0ZWQpIDwtIHJlc29sdmUuY2VsbC50eXBlcwpsZXZlbHMocmVzb2x2ZS5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpW2xldmVscyhyZXNvbHZlLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duLW1WU04iXSA8LSAic1ZTTiIKCmxldmVscyhyZXNvbHZlLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkgPC0gZ3N1YigiLSIsIl8iLCBsZXZlbHMocmVzb2x2ZS5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpKQoKcmVzb2x2ZS5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQgPC0KICBmYWN0b3IoYXMuZmFjdG9yKHJlc29sdmUuc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KSwgCiAgICAgICAgIGxldmVscyA9IGMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIsCiAgICAgICAgICAgICAgICAgICAgIlYxUl9pVlNOIiwiVjJSX2lWU04iLCJJTlAiLCJHQkMiLCJIQkMiLCJNViIsCiAgICAgICAgICAgICAgICAgICAgIlNVUyIsIk9FQyIsIkVuZG90aGVsaWFsIiwiTFAiLCJNaWNyb2dsaWEiLAogICAgICAgICAgICAgICAgICAgICJNaWNyb2dsaWFfcnAiLCJJbW11bmVfRnByIiwiVF9jZWxscyIpKQoKYGBgCgpgYGB7cn0KCnJlc29sdmUuY2VsbF90eXBlLmNvbG9ycyA8LSBodWVfcGFsKCkobGVuZ3RoKGxldmVscyhyZXNvbHZlLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkpKQoKbmFtZXMocmVzb2x2ZS5jZWxsX3R5cGUuY29sb3JzKSA8LSBsZXZlbHMocmVzb2x2ZS5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpCgpyZXNvbHZlLmNlbGxfdHlwZS5jb2xvcnNbIlYxUl9tVlNOIl0gPC0gIiMwMEZGMDAiICAgI2dyZWVuCnJlc29sdmUuY2VsbF90eXBlLmNvbG9yc1siVjJSX21WU04iXSA8LSAiI0ZGN0Y1MCIgICAjY29yYWwKcmVzb2x2ZS5jZWxsX3R5cGUuY29sb3JzWyJzVlNOIl0gPC0gIiM4RjAwRkYiICAgICAgICN2aW9sZXQgCnJlc29sdmUuY2VsbF90eXBlLmNvbG9yc1siTFAiXSA8LSAiIzAwMDBGRiIgICAgICAgICAjYmx1ZSAgIApyZXNvbHZlLmNlbGxfdHlwZS5jb2xvcnNbIlNVUyJdIDwtICIjRkYwMDAwIiAgICAgICAgI3JlZApyZXNvbHZlLmNlbGxfdHlwZS5jb2xvcnNbIkhCQyJdIDwtICIjRkZGRjAwIiAgICAgICAgI3llbGxvdwpyZXNvbHZlLmNlbGxfdHlwZS5jb2xvcnNbIlYxUl9pVlNOIl0gPC0gIiNERkZGMDAiICAgI2NoYXJ0cmV1c2UgCnJlc29sdmUuY2VsbF90eXBlLmNvbG9yc1siVjJSX2lWU04iXSA8LSAiI0ZGQTUwMCIgICAjb3JhbmdlCgpgYGAKCmBgYHtyfQoKY29sb3JzIDwtIGMoIlYxUl9tVlNOIj0iIzQ1QjUwMCIsIlYyUl9tVlNOIj0iI0U3ODUxRSIsIm1PU04iPSIjRDM5MjAwIiwic1ZTTiI9IiM5QzhERkYiLAogICAgICAgICAgICAiVjFSX2lWU04iPSIjMDBDMDg3IiwiVjJSX2lWU04iPSIjRDA5NDAwIiwiSU5QIj0iI0ZGNjFDNyIsIkdCQyI9IiNFRkZENUYiLCAKICAgICAgICAgICAgIkhCQyI9IiNGRkZGMDAiLCJNViI9IiMwMEMwQjIiLCJTVVMiPSIjRjg3NjZEIiwiT0VDIj0iIzAwQkNENiIsCiAgICAgICAgICAgICJFbmRvdGhlbGlhbCI9IiMwMEIzRjIiLCJMUCI9IiMyOUEzRkYiLCJNaWNyb2dsaWEiPSIjMDBCQzUxIiwiTWljcm9nbGlhX3JwIj0iI0QyNzdGRiIsCiAgICAgICAgICAgICJJbW11bmVfRnByIj0iI0IyQTEwMCIsIlRfY2VsbHMiPSIjRjE2NkU4IikKCmBgYAoKYGBge3J9CgpmaWcxX2Yuc2FtcGxlcyA8LSByZXNvbHZlLmRhdGFzZXRzW1sic2xpZGU3LkIyXzIiXV0KY2VsbF9uYW1lcyA8LSBjb2xuYW1lcyhmaWcxX2Yuc2FtcGxlcykKY2VsbF90eXBlcyA8LSByZXNvbHZlLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudFtjZWxsX25hbWVzXQpmaWcxX2Yuc2FtcGxlcyA8LSBBZGRNZXRhRGF0YShmaWcxX2Yuc2FtcGxlcywgY2VsbF90eXBlcywgY29sLm5hbWU9ImNlbGxfdHlwZSIpCgpmaWcxX2YgPC0gU3BhdGlhbERpbVBsb3Qob2JqZWN0ID0gZmlnMV9mLnNhbXBsZXMsIGdyb3VwLmJ5ID0gImNlbGxfdHlwZSIsIHB0LnNpemUuZmFjdG9yID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzID0gY29sb3JzLCBpbnRlcmFjdGl2ZSA9IFRSVUUpICsKICB0aGVtZSgKICAgIGFzcGVjdC5yYXRpbyA9IDEsCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMSwiY20iKQogICkKCmBgYAoKYGBge3J9CgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMV9mLnN2ZyIpLCB3aWR0aD0xMCwgaGVpZ2h0PTEwKQpmaWcxX2YgCmludmlzaWJsZShkZXYub2ZmKCkpCmZpZzFfZgoKYGBgCgojIyBMb2NhdGlvbiBvZiBjZWxsIGJlbG9uZ2luZyB0byBIQkMsIEdCQywgSU5QLCBhbmQgTFAgY2VsbCB0eXBlcywgcmVzcGVjdGl2ZWx5LiBIZWF0IGluZGljYXRlcyBjb25maWRlbmNlIG9mIHByZWRpY3RlZCB2YWx1ZXMgIAoKYGBge3J9CgpibGFua190aGVtZSA8LSB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLAogICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKC0xLCAwLCAwLCAwKSwgIm51bGwiKSwKICAgICAgICAgICAgICAgICAgICAgcGFuZWwubWFyZ2luID0gdW5pdChjKC0xLCAwLCAwLCAwKSwgIm51bGwiKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MzIpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMixhbmdsZT05MCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgICAgICAgICAgICAgIGFzcGVjdC5yYXRpbz0xKQoKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKZmlnMV9nLnBhcnRfMSA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoZmlnMV9mLnNhbXBsZXMsIGZlYXR1cmVzPXJvd25hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpWzEwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQuc2l6ZS5mYWN0b3I9NCkgKyBibGFua190aGVtZSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9ImdyZXk4NSIsaGlnaD0ibWFnZW50YSIpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMS41LCAiY20iKSwgICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBrZXkKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAjIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgdGl0bGUKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjMsIHZqdXN0ID0gMC41KSAgIyBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGxhYmVscwogICkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSA1LCBiYXJoZWlnaHQgPSAxKSkgIyBBZGp1c3QgY29sb3JiYXIgd2lkdGggYW5kIGhlaWdodAoKZmlnMV9nLnBhcnRfMiA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoZmlnMV9mLnNhbXBsZXMsIGZlYXR1cmVzPXJvd25hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpWzE3XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQuc2l6ZS5mYWN0b3I9NCkgKyBibGFua190aGVtZSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9ImdyZXk4NSIsaGlnaD0ibWFnZW50YSIpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMS41LCAiY20iKSwgICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBrZXkKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAjIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgdGl0bGUKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjI1LCB2anVzdCA9IDAuNSkgICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBsYWJlbHMKICApICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gNSwgYmFyaGVpZ2h0ID0gMSkpICMgQWRqdXN0IGNvbG9yYmFyIHdpZHRoIGFuZCBoZWlnaHQKCmZpZzFfZy5wYXJ0XzMgPC0gU3BhdGlhbEZlYXR1cmVQbG90KGZpZzFfZi5zYW1wbGVzLCBmZWF0dXJlcz1yb3duYW1lcyhyZXNvbHZlLnByZWRpY3Rpb25zLmFzc2F5KVs4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQuc2l6ZS5mYWN0b3I9NCkgKyBibGFua190aGVtZSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9ImdyZXk4NSIsaGlnaD0ibWFnZW50YSIpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMS41LCAiY20iKSwgICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBrZXkKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAjIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgdGl0bGUKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjI1LCB2anVzdCA9IDAuNSkgICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBsYWJlbHMKICApICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gNSwgYmFyaGVpZ2h0ID0gMSkpICMgQWRqdXN0IGNvbG9yYmFyIHdpZHRoIGFuZCBoZWlnaHQKCmZpZzFfZy5wYXJ0XzQgPC0gU3BhdGlhbEZlYXR1cmVQbG90KGZpZzFfZi5zYW1wbGVzLCBmZWF0dXJlcz1yb3duYW1lcyhyZXNvbHZlLnByZWRpY3Rpb25zLmFzc2F5KVsxMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0LnNpemUuZmFjdG9yPTQpICsgYmxhbmtfdGhlbWUgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93PSJncmV5ODUiLGhpZ2g9Im1hZ2VudGEiKSArCiAgdGhlbWUoCiAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDEuNSwgImNtIiksICAjIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQga2V5CiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgIyBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIHRpdGxlCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGhqdXN0ID0gMC4zLCB2anVzdCA9IDAuNSkgICMgSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBsYWJlbHMKICApICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gNSwgYmFyaGVpZ2h0ID0gMSkpICMgQWRqdXN0IGNvbG9yYmFyIHdpZHRoIGFuZCBoZWlnaHQKCgpmaWcxX2cgPC0gZ2dhcnJhbmdlKGZpZzFfZy5wYXJ0XzEsIGZpZzFfZy5wYXJ0XzIsIGZpZzFfZy5wYXJ0XzMsIGZpZzFfZy5wYXJ0XzQsIG5jb2w9NCwgbnJvdz0xLCBhbGlnbiA9ICdodicpCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWcxX2cuc3ZnIiksIHdpZHRoPTE2LCBoZWlnaHQ9NCkKZmlnMV9nIAppbnZpc2libGUoZGV2Lm9mZigpKQpmaWcxX2cKCmBgYAoKCgoK